<template>
  <view class="container">
    <view class="search-box">
      <!-- 修改为触摸事件实现按下开始、松开停止 -->
      <image 
        src="/static/yuyin.png" 
        class="image" 
        @touchstart="handleTouchStart"
        @touchend="handleTouchEnd"
        @touchcancel="handleTouchCancel"
      ></image>
      <input v-model="resultText" placeholder="搜索医生、科室、疾病" />
    </view>
  </view>
</template>

<script>
export default {
  name: 'Record',
  data() {
    return {
      AK: 'koz6PiK2dHEw6MUZXbt8hEUB',
      SK: 'x5LTTmfVLVP6dQdXhrpE2MXKQuPi6nIF',
      token: '',
      recorder: null,
      resultText: '',
      isRecording: false // 新增：标记是否正在录音
    }
  },
  methods: {
    async getAccessToken() {
      const url = `https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=${this.AK}&client_secret=${this.SK}`
      return new Promise((resolve, reject) => {
        uni.request({
          url,
          method: 'POST',
          success: res => {
            if (res.data.access_token) {
              resolve(res.data.access_token)
            } else {
              reject('获取AccessToken失败')
            }
          },
          fail: err => reject(err)
        })
      })
    },
    // 开始录音（原有逻辑封装）
    startRecord() {
      if (!this.recorder) {
        this.recorder = uni.getRecorderManager()
      }
      this.recorder.start({
        duration: 60000,      // 最长60秒
        sampleRate: 16000,    // 百度要求
        numberOfChannels: 1,
        encodeBitRate: 48000, // 微信录音最低限制
        format: 'm4a'
      })
      this.isRecording = true
      uni.showToast({ title: '录音中...', icon: 'none' })
    },
    // 停止录音（原有逻辑封装）
    stopRecord() {
      if (!this.recorder || !this.isRecording) {
        uni.showToast({ title: '请先开始录音', icon: 'none' })
        return
      }
      this.recorder.stop()
      this.isRecording = false
      this.recorder.onStop(async (res) => {
        const filePath = res.tempFilePath
        try {
          // 1. 获取文件大小（字节数）
          const statRes = await new Promise((resolve, reject) => {
            uni.getFileSystemManager().stat({
              path: filePath,
              success: resolve,
              fail: reject
            })
          })
          const audioLen = statRes.stats.size

          // 2. 读取文件为Base64
          const base64Audio = await new Promise((resolve, reject) => {
            uni.getFileSystemManager().readFile({
              filePath,
              encoding: 'base64',
              success: res => resolve(res.data),
              fail: reject
            })
          })

          // 3. 获取Token
          if (!this.token) {
            this.token = await this.getAccessToken()
          }

          // 4. 调用百度语音识别API
          const params = {
            format: 'm4a',
            rate: 16000,
            channel: 1,
            token: this.token,
            cuid: 'uni-app-device-001',
            speech: base64Audio,
            len: audioLen
          }

          uni.showLoading({ title: '识别中...' })
          uni.request({
            url: 'https://vop.baidu.com/server_api',
            method: 'POST',
            header: { 'Content-Type': 'application/json' },
            data: params,
            success: (res) => {
              uni.hideLoading()
              if (res.data.err_no === 0) {
                this.resultText = res.data.result[0]
                uni.showToast({ title: '识别成功', icon: 'success' })
              } else {
                this.resultText = ''
                uni.showToast({ title: '识别失败: ' + res.data.err_msg, icon: 'none' })
              }
            },
            fail: (err) => {
              uni.hideLoading()
              uni.showToast({ title: '网络错误', icon: 'none' })
              console.error(err)
            }
          })

        } catch (err) {
          uni.showToast({ title: '录音文件处理失败', icon: 'none' })
          console.error(err)
        }
      })
    },
    // 新增：触摸开始（按下图片）
    handleTouchStart() {
      this.startRecord()
    },
    // 新增：触摸结束（松开图片）
    handleTouchEnd() {
      if (this.isRecording) {
        this.stopRecord()
      }
    },
    // 新增：触摸中断（如意外滑出区域）
    handleTouchCancel() {
      if (this.isRecording) {
        this.stopRecord()
        uni.showToast({ title: '录音已中断', icon: 'none' })
      }
    }
  }
}
</script>

<style>
.container {
  padding: 20rpx;
}
.title {
  font-size: 36rpx;
  margin-bottom: 20rpx;
}
.result {
  margin-top: 40rpx;
  font-size: 28rpx;
  color: #333;
}
.search-box {
  display: flex;
  align-items: center;
  border: 1px solid #eee;
  border-radius: 8rpx;
  padding: 10rpx;
}
.image {
  width: 50rpx;
  height: 50rpx;
  margin-right: 10rpx;
}
input {
  flex: 1;
  height: 60rpx;
  font-size: 28rpx;
}
</style>